// 给定两个由小写字母构成的字符串 A 和 B ，只要我们可以通过交换 A 中的两个字母得到与 B 相等的结果，就返回 true ；否则返回 false 。

 

// 示例 1：

// 输入： A = "ab", B = "ba"
// 输出： true
// 示例 2：

// 输入： A = "ab", B = "ab"
// 输出： false
// 示例 3:

// 输入： A = "aa", B = "aa"
// 输出： true
// 示例 4：

// 输入： A = "aaaaaaabc", B = "aaaaaaacb"
// 输出： true
// 示例 5：

// 输入： A = "", B = "aa"
// 输出： false
 

// 提示：

// 0 <= A.length <= 20000
// 0 <= B.length <= 20000
// A 和 B 仅由小写字母构成。

#include <string>
#include <unordered_set>
#include <vector>

using namespace std;

class Solution {
public:
    bool buddyStrings(string A, string B) {
        int m = A.size();
        int n = B.size();
        if (m != n) return false;
        // A和B相同，并且A中有出现次数大于2的字母
        if (A == B && unordered_set<char>(A.begin(), A.end()).size() < m) return true;
        // 遍历两个字符串，找出2个相异的字母
        vector<int> diff{};
        for (int i{0}; i < m; ++i) {
            if (A[i] != B[i]) diff.push_back(i);
        }
        return diff.size() == 2 && A[diff[0]] == B[diff[1]] && A[diff[1]] == B[diff[0]];
    }
};

class Solution {
public:
    bool buddyStrings(string s, string goal) {
        if (s == goal) {
            vector<int> dict(26, 0);
            for (char& c : s) {
                ++dict[c - 'a'];
            }
            for (int& i : dict) {
                if (i > 1) {
                    return true;
                }
            }
            return false;
        }
        int m = s.size();
        int n = goal.size();
        if (m == n) {
            vector<int> diff_index;
            for (int i{0}; i < m; ++i) {
                if (s[i] != goal[i]) {
                    diff_index.push_back(i);
                }
            }
            if (diff_index.size() == 2) {
                swap(s[diff_index[0]], s[diff_index[1]]);
                if (s == goal) {
                    return true;
                }
            }
        }
        return false;
    }
};
